home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1997 July / macformat52.iso / mac / Shareware Plus / Comms / ICeTEe 2 / Source (for Programmers only) / ES Handler.c < prev    next >
C/C++ Source or Header  |  1996-08-31  |  10KB  |  323 lines

  1. /*    NAME:
  2.         ES Handler.c
  3.  
  4.     WRITTEN BY:
  5.         Dair Grant
  6.                 
  7.     DESCRIPTION:
  8.         This file contains an ES Handler for use by Extension Shell.
  9.  
  10.     ___________________________________________________________________________
  11. */
  12. //=============================================================================
  13. //        Include files                                                                     
  14. //-----------------------------------------------------------------------------
  15. #include <Resources.h>
  16. #include <Gestalt.h>
  17. #include <Traps.h>
  18. #include "A4Stuff.h"
  19. #include "SetupA4.h"
  20. #include "ES.h"
  21. #include "ICeTEe AddrsTable.h"
  22. #include "ICeTEe Constants.h"
  23. #include "ES Handler.h"
  24.  
  25.  
  26. //=============================================================================
  27. //        Private types                                                                     
  28. //-----------------------------------------------------------------------------
  29. typedef struct {
  30.     AEEventClass    evClass;
  31.     AEEventID        evID;
  32. } BkEventRec, **BkEventHandle;
  33.  
  34.  
  35. //=============================================================================
  36. //        Private function prototypes                                                                     
  37. //-----------------------------------------------------------------------------
  38. void    main(short theMsg, ESParamBlock *theParamBlock);
  39. void    InitialiseParamBlock(void);
  40. void    InitialiseAddrsTable(void);
  41. void    HandleTheError(void);
  42. void    SetUpIcons(short animDelay, short numIcons, short firstIcon);
  43.  
  44.  
  45. //=============================================================================
  46. //        Global variables                                                                 
  47. //-----------------------------------------------------------------------------
  48. ESParamBlock    *gTheParamBlock;
  49.  
  50.  
  51. //=============================================================================
  52. //        main : Entry point to our code resource.                                                                 
  53. //-----------------------------------------------------------------------------
  54. //        Note :    Extension Shell communicates with us via a message constant,
  55. //                and a pointer to a structure it owns. Our job is to fill in
  56. //                the details in that structure, depending on what it wants us
  57. //                to do.
  58. //-----------------------------------------------------------------------------
  59. void main(short theMsg, ESParamBlock *theParamBlock)
  60. {    long            oldA4;
  61.  
  62.     // Set up A4 so that we can access our globals
  63. #ifndef powerc
  64.     oldA4 = SetCurrentA4();
  65. #endif
  66.  
  67. #if qDebug >= 3
  68.     DebugStr("\pES Handler entered");
  69. #endif
  70.  
  71.     gTheParamBlock = theParamBlock;
  72.  
  73.  
  74.     // Case out on what we have to do
  75.     switch(theMsg) {
  76.         case kInitialiseParamBlock:
  77.              InitialiseParamBlock();
  78.              break;
  79.              
  80.         case kInitialiseAddrsTable:
  81.              InitialiseAddrsTable();
  82.              break;
  83.  
  84.         case kHandleError:
  85.              HandleTheError();
  86.              break;
  87.     
  88.         default:
  89.              ;
  90.     }
  91.  
  92. #if qDebug >= 3
  93.     DebugStr("\pES Handler exit");
  94. #endif
  95.  
  96.     // Restore A4
  97. #ifndef powerc
  98.     SetA4(oldA4);
  99. #endif
  100. }
  101.  
  102.  
  103. //=============================================================================
  104. //        InitialiseParamBlock : Initialises the ParamBlock.                                                                 
  105. //-----------------------------------------------------------------------------
  106. //        Note :    We have three tasks to perform.
  107. //                    • Check to see if we can run
  108. //                    • Set up the icons we want to display
  109. //                    • Set up the code we want installed
  110. //-----------------------------------------------------------------------------
  111. void InitialiseParamBlock(void)
  112. {
  113.     long    response;
  114.  
  115. #if qDebug >= 3
  116.     DebugStr("\pInitialiseParamBlock entered");
  117. #endif
  118.  
  119.     // Check for System 7. We depend on having System 7, and won't
  120.     // run if we don't have it. If we don't have it, we beep, post
  121.     // an error message, and show our disabled icon(s).
  122.     if (gTheParamBlock->systemVersion < 0x0700)
  123.     {
  124.         // Error details
  125.         gTheParamBlock->beepNow                = true;
  126.         gTheParamBlock->postError            = true;
  127.         gTheParamBlock->errorStringsID        = kErrorStrings;
  128.         gTheParamBlock->errorStringIndex    = kNeedSystemSeven;
  129.  
  130.  
  131.         // Icon details
  132.         SetUpIcons(kDisabledAnimDelay, kMyNumDisabledIcons, kMyFirstDisabledIcon);
  133.     }
  134.     
  135.     // Check for Component Manager
  136.     if ( Gestalt(gestaltComponentMgr, &response) != noErr)
  137.     {
  138.         // Error details
  139.         gTheParamBlock->beepNow                = true;
  140.         gTheParamBlock->postError            = true;
  141.         gTheParamBlock->errorStringsID        = kErrorStrings;
  142.         gTheParamBlock->errorStringIndex    = kNeedCompMgr;
  143.  
  144.  
  145.         // Icon details
  146.         SetUpIcons(kDisabledAnimDelay, kMyNumDisabledIcons, kMyFirstDisabledIcon);
  147.     }
  148.     
  149.     
  150.     // If a shift key, or the mouse button, is down, we don't load either.
  151.     // We don't post an error, but we do show our disabled icon(s) to let
  152.     // the user know they've turned us off.
  153.     else if ((*gTheParamBlock->IsKeyMouseDown)(kShiftKey, true))
  154.     {
  155.         // Icon details
  156.         SetUpIcons(kDisabledAnimDelay, kMyNumDisabledIcons, kMyFirstDisabledIcon);
  157.     }
  158.     
  159.     
  160.     
  161.     // Otherwise, we're allowed to run. If we had a Control Panel, we
  162.     // would also check to see if our Control Panel had turned us
  163.     // off (by setting some preference resource).
  164.     else
  165.     {
  166.         // Icon details
  167.         SetUpIcons(kEnabledAnimDelay, kMyNumEnabledIcons, kMyFirstEnabledIcon);
  168.         
  169.         
  170.         // We install one trap patch, one code block, and request an address table
  171.         gTheParamBlock->installAddressTable        = true;
  172.         gTheParamBlock->addressTableSelector    = kICeTEeAddressTable;
  173.         gTheParamBlock->numCodeResources        = 1;
  174.  
  175.  
  176.         // Details for a trap patch to MenuSelect()
  177.         gTheParamBlock->theCodeResources[kTEClick].resType        = kICeTEeResType;
  178.         gTheParamBlock->theCodeResources[kTEClick].resID        = kICeTEeResID;
  179.         gTheParamBlock->theCodeResources[kTEClick].codeType        = kTrapPatchType;
  180.         gTheParamBlock->theCodeResources[kTEClick].theCodeThing.theTrapPatch.trapWord = _TEClick;
  181.         gTheParamBlock->theCodeResources[kTEClick].theCodeThing.theTrapPatch.globalpatch = true;
  182.     }
  183.  
  184. #if qDebug >= 3
  185.     DebugStr("\pInitialiseParamBlock exit");
  186. #endif
  187. }
  188.  
  189.  
  190. //=============================================================================
  191. //        InitialiseAddrsTable : Initialise the address table.                                                     
  192. //-----------------------------------------------------------------------------
  193. //        Note :    If we requested an address table, Extension Shell calls us back
  194. //                to allow us to initialise any extensions we've made to it.
  195. //
  196. //                This routine will only be called if we request an address
  197. //                table, and is called after the address table is installed,
  198. //                but before any of the items in gTheParamBlock->theCodeResources
  199. //                are processed (since they might need to access the address
  200. //                table).
  201. //
  202. //                We should initialise the magicNumber and versionNumber fields
  203. //                with constants fixed for this build. One possible number for the
  204. //                magicNumber field would be sizeof() our address table structure.
  205. //-----------------------------------------------------------------------------
  206. void InitialiseAddrsTable(void)
  207. {
  208.     ICeTEeAddressTable    *theAddressTable;
  209.     Handle                exclusions;
  210.     Handle                errors;
  211.     BkEventHandle        bkEvent;
  212.  
  213. #if qDebug >= 3
  214.     DebugStr("\pInitialiseAddrsTable entered");
  215. #endif
  216.  
  217.     // Call Gestalt to find our address table
  218.     Gestalt(kICeTEeAddressTable, (long *) &theAddressTable);
  219.  
  220.  
  221.     // Initialise the magic number and version fields
  222.     theAddressTable->magicNumber    = kMyTableMagic;
  223.     theAddressTable->versionNumber    = kMyTableVersion;
  224.  
  225.  
  226.  
  227.     // Initialise our custom values
  228.  
  229.             // Bookmark event class & ID
  230.     bkEvent = (BkEventHandle)Get1Resource(kBkEventResType, kBkEventResID);
  231.  
  232.     if (bkEvent != nil)
  233.     {
  234.         theAddressTable->bkEventClass = (**bkEvent).evClass;
  235.         theAddressTable->bkEventID = (**bkEvent).evID;
  236.         ReleaseResource((Handle)bkEvent);
  237.  
  238.             // Exclusions
  239.         exclusions = Get1Resource(kExclusionsResType, kExclusionsResID);
  240.         DetachResource(exclusions);
  241.         theAddressTable->exclusions = exclusions;
  242.         
  243.             // Error strings
  244.         errors = Get1Resource(kErrorsResType, kErrorsResID);
  245.         DetachResource(errors);
  246.         theAddressTable->errors = errors;
  247.  
  248.     }
  249.     else
  250.     {
  251.         gTheParamBlock->beepNow                = true;
  252.         gTheParamBlock->postError            = true;
  253.         gTheParamBlock->errorStringsID        = kErrorStrings;
  254.         gTheParamBlock->errorStringIndex    = kUnknownError;
  255.     }
  256.  
  257. #if qDebug >= 3
  258.     DebugStr("\pInitialiseAddrsTable exit");
  259. #endif
  260. }
  261.  
  262.  
  263. //=============================================================================
  264. //        HandleTheError : Handle any errors                                                             
  265. //-----------------------------------------------------------------------------
  266. //        Note :    This routine is called if an error occurred during the
  267. //                installation of the items in gTheParamBlock->theCodeResources.
  268. //
  269. //                If an error occurs we beep, post an error, and request that
  270. //                as much as possible of our code be uninstalled. We also reset
  271. //                the icon details to show our disabled icons.
  272. //-----------------------------------------------------------------------------
  273. void HandleTheError(void)
  274. {
  275. #if qDebug >= 3
  276.     DebugStr("\pHandleTheError entered");
  277. #endif
  278.  
  279.     // Decide how we want to handle the error
  280.     gTheParamBlock->removeInstalledCode    = true;
  281.     gTheParamBlock->beepNow                = true;
  282.     gTheParamBlock->postError            = true;
  283.     gTheParamBlock->errorStringsID        = kErrorStrings;
  284.  
  285.  
  286.     // Message to display to the user
  287.     gTheParamBlock->errorStringIndex = kUnknownError;
  288.  
  289.  
  290.     // Icon details
  291.     SetUpIcons(kDisabledAnimDelay, kMyNumDisabledIcons, kMyFirstDisabledIcon);
  292.  
  293. #if qDebug >= 3
  294.     DebugStr("\pHandleTheError exit");
  295. #endif
  296. }
  297.  
  298.  
  299. //=============================================================================
  300. //        SetUpIcons : Set up our the icon fields in gTheParamBlock.                                                         
  301. //-----------------------------------------------------------------------------
  302. //        Note :    We are passed in the resource ID of the first icon, the number
  303. //                of icons, and a delay for animation. We fill these details
  304. //                in to gTheParamBlock.
  305. //-----------------------------------------------------------------------------
  306. void SetUpIcons(short animDelay, short numIcons, short firstIcon)
  307. {
  308.     short        i;
  309.  
  310. #if qDebug >= 3
  311.     DebugStr("\pSetUpIcons entered");
  312. #endif
  313.  
  314.     gTheParamBlock->animationDelay    = animDelay;
  315.     gTheParamBlock->numIcons        = numIcons;
  316.     for (i = 1; i <= numIcons; i++)
  317.         gTheParamBlock->theIcons[i] = firstIcon + i - 1;
  318.  
  319. #if qDebug >= 3
  320.     DebugStr("\pSetUpIcons exit");
  321. #endif
  322. }
  323.